<?php
declare(strict_types=1);

namespace Zms\Unit;

use Exception;

/**
 * 文件工具
 * Class Arr
 * @package Core\Method
 */
class File
{
    /**
     * 持续写入文件
     * @param string $file
     * @param string $content
     * @return string|null
     */
    public static function appendWrite(string $file, string $content)
    {
        try {
            if (!file_exists($file)) {
                $fileDir = dirname($file);
                if (!is_dir($fileDir)) {
                    if (!Directory::created($fileDir)) {
                        return null;
                    }
                }
            }
            $fileRes = fopen($file, "a+");
            if ($fileRes) {
                fwrite($fileRes, $content);
                fclose($fileRes);
                return $file;
            }
            return null;
        } catch (Exception $exception) {
            return null;
        }
    }


    /**
     * 更改文件名称
     * @param string $fileName 文件路径
     * @param string|null $newsName 新的文件名称
     * @return string
     */
    public static function changeFileName($fileName, $newsName = null)
    {
        $extend = self::extendName($fileName);
        return dirname($fileName) . '/' . ($newsName ?: Str::md5_16([time(), uniqid()])) . '.' . $extend;
    }


    /**
     * 获取文件扩展名
     * @param string $fileName 文件名称
     * @param bool $lower 是否转小写
     * @return string
     */
    public static function extendName(string $fileName, bool $lower = true): string
    {
        $data = Str::explode('.', $fileName);
        if (count($data) === 1) {
            return '';
        }
        return $lower ? strtolower(end($data)) : end($data);
    }


    /**
     * 创建文件所在的目录
     * @param string $file
     * @return false|string
     */
    public static function createdFileDirectory(string $file)
    {
        if (Directory::created(dirname($file))) {
            return $file;
        }
        return false;
    }


    /**
     * @describe 文件写入信息
     * @user zlf <zms-pro@qq.com> 2025/3/25
     * @param string $filename
     * @param mixed $data
     * @param int $flags
     * @return false|int
     */
    public static function put($filename, $data, $flags = 0)
    {

        $dir = dirname($filename);
        if (is_file($filename)) {
            return file_put_contents($filename, $data, $flags);
        }
        if (!is_dir($dir)) {
            Directory::created($dir);
        }
        return file_put_contents($filename, $data, $flags);
    }


    /**
     * @describe 移动文件到指定文件夹
     * @user zlf <zms-pro@qq.com> 2025/9/9
     * @param string $file
     * @param string $dir
     * @return bool
     */
    public static function moveFileToDir($file, $dir)
    {
        if (is_dir($dir) || Directory::created($dir)) {
            return rename($file, rtrim($dir) . '/' . basename($file));
        }
        return false;
    }


    /**
     * @describe 复制文件
     * @user zlf <zms-pro@qq.com> 2025/9/9
     * @param string $file 复制源文件
     * @param string $newFile 新文件
     * @param bool $keepFile 是否保留源文件
     * @return bool
     */
    public static function copy($file, $newFile, $keepFile = true)
    {
        if (self::createdFileDirectory($newFile)) {
            return $keepFile ? copy($file, $newFile) : rename($file, $newFile);
        }
        return false;
    }
}